import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { User } from './user.entity';

/**
 * Refresh Token 实体
 * 用于实现安全的 Token 无感刷新机制
 */
@Entity('refresh_tokens')
export class RefreshToken {
  @PrimaryGeneratedColumn()
  id: number;

  /**
   * Token 值（使用 UUID 或随机字符串）
   */
  @Column({ type: 'varchar', length: 500, unique: true })
  token: string;

  /**
   * 关联的用户
   */
  @ManyToOne(() => User, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'user_id' })
  user: User;

  @Column({ name: 'user_id' })
  userId: number;

  /**
   * 是否已使用（用于检测重复使用）
   */
  @Column({ name: 'is_used', type: 'boolean', default: false })
  isUsed: boolean;

  /**
   * 是否已废除（主动登出或安全事件）
   */
  @Column({ name: 'is_revoked', type: 'boolean', default: false })
  isRevoked: boolean;

  /**
   * 过期时间
   */
  @Column({ name: 'expires_at', type: 'timestamp' })
  expiresAt: Date;

  /**
   * 设备指纹（浏览器特征）
   */
  @Column({ name: 'device_fingerprint', type: 'varchar', length: 255 })
  deviceFingerprint: string;

  /**
   * IP 地址
   */
  @Column({ name: 'ip_address', type: 'varchar', length: 45 })
  ipAddress: string;

  /**
   * User Agent
   */
  @Column({ name: 'user_agent', type: 'text' })
  userAgent: string;

  /**
   * 上一个 Token 的 ID（用于 Token 家族链检测）
   */
  @Column({ name: 'previous_token_id', type: 'int', nullable: true })
  previousTokenId?: number;

  /**
   * Token 家族 ID（同一次登录产生的所有 Token 共享）
   */
  @Column({ name: 'family_id', type: 'varchar', length: 36 })
  familyId: string;

  /**
   * 创建时间
   */
  @CreateDateColumn({ name: 'created_at' })
  createdAt: Date;

  /**
   * 最后使用时间
   */
  @Column({ name: 'last_used_at', type: 'timestamp', nullable: true })
  lastUsedAt?: Date;
}
